package com.le.common.utils;

import com.le.common.utils.domin.DateDifference;
import org.apache.commons.lang3.time.DateFormatUtils;

import java.lang.management.ManagementFactory;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * 时间工具类
 *
 * @author shi
 */
public class DateUtils extends org.apache.commons.lang3.time.DateUtils {

    public static String YYYY = "yyyy";

    public static String YYYY_MM = "yyyy-MM";

    public static String YYYY_MM_DD = "yyyy-MM-dd";

    public static String YYYYMMDDHHMMSS = "yyyyMMddHHmmss";

    public static String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";

    /**
     * 获取当前Date型日期
     *
     * @return Date() 当前日期
     */
    public static Date getNowDate() {
        return new Date();
    }

    /**
     * 获取当前日期, 默认格式为 yyyy-MM-dd
     *
     * @return String
     */
    public static String getDate() {
        return dateTimeNow(YYYY_MM_DD);
    }


    /**
     * 获取当前日期, 默认格式为 yyyy-MM-dd HH:mm:ss
     *
     * @return String
     */
    public static String getDateTime() {
        return dateTimeNow(YYYY_MM_DD_HH_MM_SS);
    }


    /**
     * 获取当前日期, 默认格式为 yyyyMMddHHmmss
     *
     * @return String
     */
    public static String dateTimeNow() {
        return dateTimeNow(YYYYMMDDHHMMSS);
    }

    /**
     * 获取当前日期, 默认格式为 年/月/日 如2018/08/08
     */
    public static final String datePath() {
        return DateFormatUtils.format(getNowDate(), "yyyy/MM/dd");
    }

    /**
     * 获取当前日期, 默认格式为 年月日 如20180808
     */
    public static final String dateTime() {
        return DateFormatUtils.format(getNowDate(), "yyyyMMdd");
    }

    /**
     * 获取当前日期, 自定义格式
     *
     * @return String
     */
    public static String dateTimeNow(final String format) {
        return parseDateToStr(format, new Date());
    }


    /**
     * Date 转化为指定格式的 String
     *
     * @return String
     */
    public static String parseDateToStr(final String format, final Date date) {
        return new SimpleDateFormat(format).format(date);
    }

    /**
     * 指定格式 String 转化为 Date
     * @param format
     * @param ts
     * @return
     */
    public static Date dateTime(final String format, final String ts) {
        try {
            return new SimpleDateFormat(format).parse(ts);
        } catch (ParseException e) {
            throw new RuntimeException(e);
        }
    }


    /**
     * 获取服务器启动时间
     */
    public static Date getServerStartDate() {
        long time = ManagementFactory.getRuntimeMXBean().getStartTime();
        return new Date(time);
    }


    /**
     * 计算两个时间差
     */
    public static DateDifference getDateDifference(Date endDate, Date nowDate) {
        long nd = 1000 * 24 * 60 * 60;
        long nh = 1000 * 60 * 60;
        long nm = 1000 * 60;
        long ns = 1000;

        DateDifference dateDifference = new DateDifference();

        // 获得两个时间的毫秒时间差异
        long diff = endDate.getTime() - nowDate.getTime();
        // 天
        dateDifference.setDay(diff / nd);
        // 小时
        dateDifference.setHour(diff % nd / nh);
        // 分钟
        dateDifference.setMinute(diff % nd % nh / nm);
        // 秒
        dateDifference.setSecond(diff % nd % nh % nm / ns);
        // 毫秒
        dateDifference.setMillisecond(diff);

        return dateDifference;
    }


    /**
     * Date + 天数
     */
    public static Date addNowDate(Date date, Integer days) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(Calendar.DATE, days);
        Date targetDate = calendar.getTime();
        return targetDate;
    }






}
